from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import not_, or_, and_


class Config(object):
    DEBUG = True
    SQLALCHEMY_DATABASE_URI = 'mysql://root:mysql@127.0.0.1:3306/flask_sql'
    SQLALCHEMY_TRACK_MODIFICATIONS = True


app = Flask(__name__)

app.config.from_object(Config)

db = SQLAlchemy(app)

class Role(db.Model):
    __tablename__ = "simple01"
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(128),unique=True)
    # 定义一对多关系
    users = db.relationship('User',backref='simple01')
    # print(users)
    def __repr__(self):
        return "simple01表: %s    %s" % (self.id,self.name)

class User(db.Model):
    __tablename__ = 'user'
    id = db.Column(db.Integer,primary_key=True)
    name = db.Column(db.String(128),unique=True)
    email = db.Column(db.String(128),unique=True)
    password = db.Column(db.String(128))
    # 定义外键字段
    role_id = db.Column(db.Integer,db.ForeignKey(Role.id))
    def __repr__(self):
        return "User表: %s  %s  %s  %s" % (self.id, self.name, self.email, self.password)


@app.route('/')
def hello():
    return "hello world"

if __name__ == '__main__':
    db.drop_all()
    db.create_all()
    # 插入一条数据
    ro1 = Role(name='admin')
    db.session.add(ro1)
    db.session.commit()
    # 再次插入一条数据
    ro2 = Role(name='user')
    db.session.add(ro2)
    db.session.commit()

    us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
    us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
    us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
    us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
    us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)
    us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
    us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
    us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)
    us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
    us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
    db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10])

    print(1)
    paginate = User.query.paginate(2, 3)
    print(paginate)
    print(paginate.items)
    print("*"*50)
    for item in paginate.items:
        print(item)

    db.session.commit()

    app.run(debug=True)

    """
    以下代码需要再终端执行,若要在脚本执行则需添加到脚本命令

    查询所有用户数据，以列表形式返回查询的所有结果
    User.query.all()

    查询有多少个用户
    User.query.count()

    查询主键id==1的用户，返回指定主键对应的行，若不存在则返回None
    User.query.get(1)

    查询id为4的用户[3种方式]
    User.query.get(4)

    # 使用filter_by精确查询
    # id:就是属于User类  first: 获取一条数据
    User.query.filter_by(id=4).first()

    # 使用filter查询，
    # 必须指明id来至于那个类：User.id
    User.query.filter(User.id==4).first()

    查询名字结尾字符为g的所有数据[开始startswith/包含contains]

     User.query.filter(User.name.endswith('g')).all()

     User.query.filter(User.name.contains('g')).all()

    查询名字不等于wang的所有数据[2种方式]
    # 使用!=符号 （常用）
    User.query.filter(User.name!="wang").all()
    # 需要导入 from sqlalchemy import not_
    User.query.filter(not_(User.name=="wang")).all()

    查询名字和邮箱都以 li 开头的所有数据[2种方式]

    User.query.filter(User.name.startswith('li'), User.email.startswith('li')).all()

    User.query.filter(and_(User.name.startswith('li'), User.email.startswith('li'))).all()


    查询password是 `123456` 或者 `email` 以 `itheima.com` 结尾的所有数据

    # 必须要导入 from sqlalchemy import or_
    User.query.filter(or_(User.password=="123456", User.email.endswith('itheima.com'))).all()


    查询id为 [1, 3, 5, 7, 9] 的用户列表
    # in_([]) 包含操作
    User.query.filter(User.id.in_([1,3,5,7,9])).all()

    查询name为liu的角色数据
    User.query.filter(User.name == "liu").first()

    查询所有用户数据，并以邮箱降序排序
    # 借助order_by函数进行排序  desc：降序 aesc: 升序
    User.query.order_by(User.email.desc()).all()

    将所有数据分页，每页3个，查询第2页的数据(重点)
    paginate = User.query.paginate(2, 3)

    # 获取当前页页码的所有数据
    paginate.items

    # 获取当前页码
    paginate.page

    # 获取总页数
    paginate.pages

    """
